/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package cliente;

import cliente.auxiliar.Envia;
import cliente.auxiliar.Conexao;
import cliente.auxiliar.Recebe;
import common.*;
import cliente.gui.Login;
import cliente.gui.MyTwitter;
import cliente.gui.Register;
import cliente.gui.Erro;
import cliente.rmi_aux.RMIRecebeTweets;
import cliente.rmi_aux.RMInterface;
import cliente.rmi_aux.ThreadPing;
import cliente.web.WebArquivo;
import java.rmi.RemoteException;



/**
 *
 * @author A8
 */
public class GereOperacoes {

    private Login log = null;
    private Recebe rec = null;
    private Envia env = null;
    private Conexao conect = null;
    private MyTwitter mytwi = null;
    private Register reg = null;
    private Erro erro = null;
    private RMInterface inter = null;
    private RMIRecebeTweets recTwe = null;
    private boolean displayMode;
    private String nome="";
    private OpFicheiro ficheiro;
    private String mensagem="";
    private ThreadPing ping;
    private boolean webInterface = false;
    private WebArquivo arquivador = null;

    public GereOperacoes() {
        displayMode=false;
    }


    //--------------------------------------------------- GET

    public Login getLogin(){
        return log;
    }

    public Recebe getRecebe(){
        return rec;
    }

    public Envia getEnvia(){
        return env;
    }

    public Conexao getConexao(){
        return conect;
    }

    public MyTwitter getMyTwi(){
        return mytwi;
    }

    public Register getRegister(){
        return reg;
    }

    public Erro getErro(){
        return erro;
    }

    public RMInterface getInter() {
        return inter;
    }

    public RMIRecebeTweets getRecTwe() {
        return recTwe;
    }

    public boolean isDisplayMode() {
        return displayMode;
    }

    public String getNome() {
        return nome;
    }

    public String getMensagem() {
        return mensagem;
    }

    public ThreadPing getPing() {
        return ping;
    }

    public boolean isWebInterface() {
        return webInterface;
    }

    public WebArquivo getArquivador() {
        return arquivador;
    }


    //--------------------------------------------------- SET

    public void setLogin(Login log){
        this.log = log;
    }

    public void setRecebe(Recebe rec){
        this.rec = rec;
    }

    public void setEnvia(Envia env){
        this.env = env;
    }

    public void setConexao(Conexao conect){
        this.conect = conect;
    }

    public void setMyTwi(MyTwitter mytwi){
        this.mytwi = mytwi;
    }

    public void setRegister(Register reg){
        this.reg = reg;
    }

    public void setErro(Erro erro){
        this.erro = erro;
    }

    public void setLogDesp(){
        log.setVisible(false);
    }

    public void setInter(RMInterface inter) {
        this.inter = inter;
    }

    public void setRecTwe(RMIRecebeTweets recTwe) {
        this.recTwe = recTwe;
    }

    public void setDisplayMode(boolean displayMode) {
        this.displayMode = displayMode;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

    public void setPing(ThreadPing ping) {
        this.ping = ping;
    }

    public void setWebInterface(boolean webInterface) {
        this.webInterface = webInterface;
    }

    public void setArquivador(WebArquivo arquivador) {
        this.arquivador = arquivador;
    }
    

    public void trataMensagem(Menssagem sms){

        if(sms instanceof RespOut){
            RespOut depLogin = (RespOut)sms;

            if(depLogin.getMenssagem().contains("login"))
                doLogin(depLogin);

            if(depLogin.getMenssagem().contains("register"))
                doRegist(depLogin);

            if(depLogin.getMenssagem().contains("Following")){
                System.out.println("Estou no following");
                doFollowing(depLogin);
            }

            if(depLogin.getMenssagem().contains("Follower")){
                System.out.println("Estou no follower");
                doFollowers(depLogin);
            }

            if(depLogin.getMenssagem().contains("Pesquisa")){
                System.out.println("Estou no pesquisa");
                doSearch(depLogin);
            }

            if(depLogin.getMenssagem().contains("Mensagens")){
                System.out.println("Estou no apresentar mensagens.");
                doTwitters(depLogin);
            }

            if(depLogin.getMenssagem().contains("Detalhes")){
                System.out.println("Estou no apresentar detalhes.");
                doDetails(depLogin);
            }

            if(depLogin.getMenssagem().contains("Minhas")){
                System.out.println("Estou no apresentar minhas mensagens.");
                doMyTwitters(depLogin);
            }

            if(depLogin.getMenssagem().contains("Loggout ok")){
                System.out.println("Estou no loggout.");
            }
        }
        if(sms instanceof OpErro){
            OpErro problema = (OpErro) sms;
            new Erro(problema.getTipo(), problema.getCausa());
        }
    }

    public void doLogin(RespOut depLogin){

        if(depLogin.getEmissor().contains("Server") && depLogin.getMenssagem().equalsIgnoreCase("login ok")){
            System.out.println("[INFO]Login efectuado com sucesso!!!"+depLogin.getReceptor());

            if(getConexao().getPort()==ClienteRMI.mainPort){
                mandaCredenciais(depLogin);
                if(this.isWebInterface()){
                    this.getArquivador().setLogin(depLogin);
                }
                if(!this.isWebInterface()){
                    if(!this.getPing().isAlive())
                        this.getPing().start();
                }
            }
            
            this.setNome(depLogin.getReceptor());

            leFicheiro();

            if(!this.isWebInterface()){
                log.setVisible(false);
                depLogin(depLogin);
            }
        }
        else
            System.out.println("[ERRO]:"+depLogin.getMenssagem());
    }

    public void doRegist(RespOut depRegist){
        if(depRegist.getEmissor().contains("Server") && depRegist.getMenssagem().equalsIgnoreCase("register ok")){
            System.out.println("[INFO]Registo efectuado com sucesso!!!");
            this.setNome(depRegist.getReceptor());

            if(getConexao().getPort()==ClienteRMI.mainPort){
                if(this.webInterface){
                    this.getArquivador().setRegisto(depRegist);
                }
                mandaCredenciais(depRegist);
            }
            criaFile();
            if(!this.isWebInterface()){
                reg.setVisible(false);
                depLogin(depRegist);
            }
        }
        else
            System.out.println("[ERRO]:"+depRegist.getMenssagem());
    }

    public void doFollowing(RespOut depRegist){
        if(depRegist.getEmissor().contains("Server") && depRegist.getMenssagem().contains("Following")){
            System.out.println("A tratar do following");

            if(this.isWebInterface()){
                System.out.println("Resposta:"+depRegist.getMenssagem());
                this.getArquivador().setFolloing(depRegist);
                System.out.println("Dados adicionados ao buffer.");
            }

            else{
                String []buffer_foling=(depRegist.getMenssagem()).split(":");
                mytwi.setBufferFolling(buffer_foling);
            }
        }
        if(depRegist.getMenssagem().contains("Erro")){
            System.out.println("[ERRO]:"+depRegist.getMenssagem());
        }
    }

    public void doFollowers(RespOut depFollowers){
        if(depFollowers.getEmissor().contains("Server") && depFollowers.getMenssagem().contains("Follower")){

            if(this.isWebInterface()){
                System.out.println("Resposta:"+depFollowers.getMenssagem());
                this.getArquivador().setFollowers(depFollowers);
                System.out.println("Dados adicionados ao buffer.");
            }

            else{
                String []buffer_followers=(depFollowers.getMenssagem()).split(":");
                mytwi.setBufferFolling(buffer_followers);
            }
        }
    }

    public void doTwitters(RespOut depTwette){
        if(depTwette.getEmissor().contains("Server") && depTwette.getMenssagem().contains("Mensagens")){

            if (this.isWebInterface()){
                this.getArquivador().setSeeTweet(depTwette);
            }
            else{
                String []buffer_mensagens=(depTwette.getMenssagem()).split("#");
                mytwi.setBufferMenssagens(buffer_mensagens);
            }
        }
    }

    public void doMyTwitters(RespOut depMyTwitters){
        if(depMyTwitters.getEmissor().contains("Server") && depMyTwitters.getMenssagem().contains("Minhas")){
            System.out.println("Entrei");
            String []buffer_minhas_mensagens=(depMyTwitters.getMenssagem()).split("#");
            mytwi.setBufferMinhasMenssagens(buffer_minhas_mensagens);
        }
    }

    public void doSearch(RespOut depSearch){
        if(depSearch.getEmissor().contains("Server") && depSearch.getMenssagem().contains("Pesquisa")){

            if (this.isWebInterface()){
                this.getArquivador().setSearch(depSearch);
            }
            else{
                String []buffer_search=(depSearch.getMenssagem()).split(":");
                mytwi.setBufferSearch(buffer_search);
            }
        }
    }

    public void doDetails(RespOut depDetails){
        if(depDetails.getEmissor().contains("Server") && depDetails.getMenssagem().contains("Detalhes")){
            if (this.isWebInterface()){
                this.getArquivador().setDetails(depDetails);
            }
            else{
                String []buffer_details=(depDetails.getMenssagem()).split(":");
                mytwi.setDetails(buffer_details[1], buffer_details[2]);
            }
        }
    }
    public void depLogin(RespOut sms){
        mytwi.setNick(sms.getReceptor());
        mytwi.setVisible(false);
        mytwi.setVisible(true);
    }

    public void fazLogout(){
        
        this.mytwi.limpaCampos();
        if(this.getConexao().getPort()!=ClienteRMI.mainPort){
            this.conect.fechaLigacoes();
        }
        encenrraJanelasErro("Loggout!!!");
    }

    public boolean verificaTempo(long tempoInicial){

        System.out.println("a verificar tempo!!!");
        System.out.println("Tempo inicial: "+tempoInicial);
        //120000
        if((System.currentTimeMillis()-tempoInicial)>=120000){
            System.out.println("Verdadeiro!!!");
            return true;
        }
        return false;
    }

    public void encenrraJanelasErro(String problema){

        conect.setEstado("Off");
        this.getMyTwi().setVisible(false);
        if (this.getRegister().isActive()) { 
            this.reg.setVisible(false);
        }
        Login login = new Login(this);
        login.setVisible(true);
        this.setLogin(login);
        new Erro("Ligacao", problema);
    }

    public void mandaCredenciais(RespOut sms){
        System.out.println("No manda credenciais!!!");
        try {
            this.getConexao().getHandling().adicionaLigado(recTwe, sms.getReceptor());
        } catch (RemoteException ex) {
            System.out.println("[ERRO]Remote: Erro no envio das credenciais!\n"+ex.getMessage());
            //ex.printStackTrace();
        }
    }


    public void leFicheiro(){

        ficheiro = new OpFicheiro(this);
        ficheiro.leBuffer();
    }

    public void criaFile(){
        ficheiro = new OpFicheiro(this);
        ficheiro.criaFicheiro();
    }
}
